package com.zzh.partnersys.gateway.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.reactive.CorsWebFilter;
import org.springframework.web.cors.reactive.UrlBasedCorsConfigurationSource;

import java.util.Arrays;

/**
 * 跨域配置
 * 解决前端请求后端的跨域问题
 *
 * @author zzh
 */
@Configuration
public class CorsConfig {

    @Bean
    public CorsWebFilter corsWebFilter() {
        CorsConfiguration corsConfig = new CorsConfiguration();
        
        // 允许所有来源（使用模式匹配，支持所有域名）
        // 注意：当 allowCredentials 为 true 时，不能使用 "*"，但可以使用模式如 "http://*" 或具体域名
        // 开发环境：允许所有来源（包括 localhost、127.0.0.1 等）
        corsConfig.addAllowedOriginPattern("*");
        
        // 允许所有请求头
        corsConfig.addAllowedHeader("*");
        
        // 允许所有请求方法
        corsConfig.setAllowedMethods(Arrays.asList("GET", "POST", "PUT", "DELETE", "OPTIONS", "PATCH"));
        
        // 允许携带凭证（Cookie、Session等）
        // 注意：Spring 5.3+ 支持 allowedOriginPatterns 与 allowCredentials 同时使用
        corsConfig.setAllowCredentials(true);
        
        // 预检请求的缓存时间（秒）
        corsConfig.setMaxAge(3600L);
        
        // 允许暴露的响应头（包括 Set-Cookie，这样前端才能接收到 Cookie）
        corsConfig.setExposedHeaders(Arrays.asList(
                "Content-Type",
                "X-Requested-With",
                "accept",
                "Origin",
                "Access-Control-Request-Method",
                "Access-Control-Request-Headers",
                "X-User-Id",
                "Set-Cookie"  // 暴露 Set-Cookie 响应头，允许前端接收 Cookie
        ));
        
        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        // 对所有路径应用跨域配置
        source.registerCorsConfiguration("/**", corsConfig);
        
        return new CorsWebFilter(source);
    }
}

